home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr30 / drip21.zip / DRIP21.ASM < prev    next >
Assembly Source File  |  1993-05-10  |  4KB  |  204 lines

  1. TITLE    DRIP    5-26-87    [4-21-88]
  2.  
  3. ;Toad Hall disassy, tweak
  4. ;Goes TSR, activate/toggle with Scroll Lock key.
  5. ;Characters randomly drip down/off the screen
  6.  
  7. LF    EQU    0AH
  8. CR    EQU    0DH
  9. ;
  10.  
  11. Cseg    SEGMENT
  12.     ASSUME DS:Cseg, SS:Cseg ,CS:Cseg ,ES:Cseg
  13.     ORG    100H
  14.  
  15.  
  16. Drip    proc    near
  17.     JMP    Start
  18.  
  19. int8Vec    dd    0            ;save old Int 8 vector
  20. saveDI    dw    0
  21. saveSI    dw    0
  22.  
  23. video    dw    0B000H            ;default mono screen memory
  24.  
  25. wcntr_13A    dw    40H        ;counter
  26. byte_13C    DB    0FFH
  27. bflag_13D    DB    0
  28. bcntr_13E    DB    0
  29. bflag_13F    DB    0
  30. bcntr_140    DB    0
  31. word_2BE    dw    0
  32. Drip    endp
  33.  
  34.  
  35. NewInt8    proc    far
  36.     ASSUME    DS:Nothing
  37.  
  38.     PUSHF                ;save user's flags
  39.     PUSH    AX            ;and his Int 8 request
  40.     MOV    AH,2            ;get shift status
  41.     INT    16H
  42.     AND    AL,10H            ;mask for Scroll Lock key
  43.     JZ    Continue_Int8        ; continue to Int 8
  44.     CMP    CS:bcntr_13E,0        ;counter zeroed?
  45.     JZ    L01A0            ; yep, time to act
  46.      DEC    CS:bcntr_13E        ;decr counter
  47.      JMP    SHORT    Continue_Int8
  48.  
  49. L01A0:    CMP    CS:bflag_13D,0        ;flag set?
  50.     JNZ    Continue_Int8        ; yep, just continue to Int 8
  51.      JMP    SHORT    L01B2        ;time to act
  52.  
  53. Continue_Int8:
  54.     POP    AX            ;restore user's Int 8 svc
  55.     POPF                ;restore user's flags
  56.     JMP    CS:int8Vec        ;jump to old Int 8
  57.  
  58. L01B2:    PUSHF                ;save flags
  59.     CALL    CS:int8Vec        ;call old Int 8
  60.     PUSH    ES            ;save all his regs
  61.     PUSH    DS
  62.     PUSH    DX
  63.     PUSH    CX
  64.     PUSH    DI
  65.     PUSH    SI
  66.     mov    ax,CS
  67.     mov    DS,ax
  68.     ASSUME    DS:Cseg
  69.  
  70.     MOV    AX,video
  71.     MOV    ES,AX
  72.     ASSUME    ES:Nothing
  73.  
  74.     cmp    bflag_13F,0        ;flag clear?
  75.     JZ    L01D9            ; yep
  76.      MOV    DI,saveDI        ;get our screen pointers
  77.      MOV    SI,saveSI
  78.      STI                ;enable ints
  79.      JMP    SHORT    MoveChar    ;go to work
  80.  
  81. L01D9:    MOV    bflag_13D,0FFH        ;set flag
  82.     STI                ;enable interrupts
  83.     MOV    bcntr_140,64H        ;refresh counter
  84. Lup1E4:    CMP    bcntr_140,0        ;zeroed out?
  85.     JNZ    L01EE            ; nope
  86.      JMP    Pop_Iret        ; return
  87.  
  88. L01EE:    DEC    bcntr_140        ;count down
  89.     CALL    L02AC
  90.     AND    AX,0FFEH
  91.     MOV    SI,AX
  92.     MOV    AL,ES:[SI]
  93.     CMP    AL,20H            ;just a space?
  94.     JZ    Lup1E4            ; yep, try again
  95.     or    al,al            ;just a zero?
  96.     JZ    Lup1E4            ; yep, try again
  97.     CMP    SI,0FA0H        ;screen bottom?
  98.     JNB    Lup1E4            ; not yet, try again
  99.     MOV    DI,SI            ;point to new char location
  100.     ADD    DI,0A0H            ;move this far each time (1 line)
  101.     CMP    DI,0FA0H        ;screen bottom?
  102.     JNB    L025B            ;not yet, continue
  103.     MOV    AL,ES:[DI]        ;get char at new location
  104.     CMP    AL,20H            ;just a space?
  105.     JZ    Save_Iret        ;yep, save screen ptrs, Iret
  106.     or    al,al            ;just a zero?
  107.     JNZ    Lup1E4            ; yep, continue
  108. Save_Iret:
  109.     MOV    saveDI,DI            ;save screen pointers
  110.     MOV    saveSI,SI
  111.     MOV    bflag_13F,0FFH            ;reset flag
  112.     JMP    SHORT    Pop_Iret        ;return
  113.  
  114. MoveChar:
  115.     MOV    bflag_13F,0            ;turn flag off
  116.     MOV    AL,ES:[SI]            ;snarf screen char
  117.     MOV    ES:[DI],AL            ;move it here
  118.     MOV    BYTE PTR ES:[SI],20H        ;blank out old char
  119.     MOV    SI,DI
  120.     ADD    DI,0A0H
  121.     CMP    DI,0FA0H            ;screen bottom?
  122.     JNB    L025B                ; not yet
  123.     MOV    AL,ES:[DI]            ;get char
  124.     CMP    AL,20H                ;just a space?
  125.     JZ    Save_Iret            ; yep, save ptrs, Iret
  126.     or    al,al                ; a 0?
  127.     JZ    Save_Iret            ; yep, save ptrs, Iret
  128.     JMP    SHORT    L025F
  129.  
  130. L025B:    MOV    BYTE PTR ES:[SI],20H        ;stuff space on screen
  131. L025F:    DEC    wcntr_13A            ;decrement counter
  132.     JNZ    L026F
  133.      SHR    byte_13C,1
  134.      MOV    wcntr_13A,40H            ;refresh counter
  135. L026F:    CALL    L02AC
  136.     AND    AL,byte_13C
  137.     MOV    bcntr_13E,AL
  138. Pop_Iret:
  139.     POP    SI
  140.     POP    DI
  141.     POP    CX
  142.     POP    DX
  143.     POP    DS
  144.     POP    ES
  145.     POP    AX
  146.     POPF
  147.     MOV    CS:bflag_13D,0            ;clear flag
  148.     IRET
  149. NewInt8    endp
  150.  
  151. L02AC    proc    near
  152.     MOV    AX,word_2BE
  153.     PUSH    AX
  154.     AND    AH,0B4H
  155.     POP    AX
  156.     JPE    L02B7
  157.      STC
  158. L02B7:    RCL    AX,1
  159.     MOV    word_2BE,AX
  160.     RET
  161. L02AC    endp
  162.  
  163.  
  164. Start    proc    near
  165.     MOV    ax,3508H        ;get Int8 vector
  166.     INT    21H
  167.     mov    word ptr int8Vec,bx    ;save ofs
  168.     mov    word ptr int8Vec+2,ES    ;save seg
  169.  
  170.     MOV    AH,2CH            ;get DOS system time
  171.     INT    21H
  172.     MOV    word_2BE,DX        ;save seconds, deciseconds
  173.     MOV    bcntr_13E,0FFH        ;refresh counter
  174.     MOV    AH,0FH            ;get current video mode
  175.     INT    10H
  176.     CMP    AL,6            ;?
  177.     JZ    Use_Mono        ; yep
  178.     CMP    AL,7            ;mono?
  179.     JZ    Use_Mono        ;yep
  180.      MOV    video,0B800H        ;use color screen
  181.  
  182. Use_Mono:
  183.     MOV    DX,OFFSET NewInt8    ;DS:dx = our service
  184.     mov    ax,2508H        ;set new Int 8 vector
  185.     INT    21H
  186.  
  187.     MOV    DX,offset Start        ;program end
  188.     MOV    CL,4
  189.     SHR    DX,CL            ;compute size in paras
  190.     INC    DX            ;safeside
  191.     MOV    AH,31H            ;advanced TSR
  192.     INT    21H
  193.  
  194.     DB    'DRIP Version 2.01',0    ;,CR,LF
  195.     DB    'G. Masters 5/25/87',0    ;,CR,LF
  196.     db    'Toad Hall 880421',0
  197. ;    DB    1AH
  198. ;    DB    90H
  199. Start    endp
  200.  
  201.  
  202. Cseg    ENDS
  203.     END    Drip
  204.